/**
 * jQuery плагин для работы с схемами метро.
 * Используйте Firebug для отладки.
 * @author Bashtannik Andrew S. <bashtannik@gmail.com>
 * @version 0.2
 */

(function($){

/**
 * Профиль метрополитена по умолчанию.
 * @property name String Название профиля
 * @property version String Версия
 * @property image String URL-адрес изображения схемы
 * @property stations Object Координаты и названия станций
 */
var default_profile = {
    name : "",
    version : "",
    image : "",
    stations : null
}

/**
 * Значения по умолчанию.
 * Если нет пользовательских обработчиков событий, то используется заглушка jQuery.
 * @property click Обработчик события $.click тега area
 * @property mouseover Обработчик события $.mouseover тега area
 * @property mouseout Обработчик события $.mouseout тега area
 * @property callback Функция обратного вызова, которая будет вызвана для каждого тега area
 * @property ready Обработчик события, возникающего после окончания создания схемы
 * @property debug Bool Режим отладки
 */

var defaults = {
    click : $.noop,
    mouseover : $.noop,
    mouseout : $.noop,
    callback : $.noop,
    ready : $.noop,
    debug : typeof(console) == "object", // Автоматически включить режим отладки, если запущен Firebug
};

/**
 * Создание карты метро
 * @param settings Object Настройки
 */
$.fn.metro = function(settings) {
    return this.each(function(){

	var sets = $.extend(defaults,settings);
	if(typeof(settings.profile) == "object") // Если профиль передается в виде объекта
	    $(this).data("profile",$.extend(default_profile, settings.profile));
	if(typeof(settings.profile) == "string") // Если профиль передается в виде строки - имени профиля
	    $(this).data("profile",$.extend(default_profile, $("html").data(settings.profile)));

	/* Создание элементов изображения и разметки */
	// Проверка наличия адреса изображения в профиле
	if($(this).data("profile").image=="")
	    throw("Image is not speciefed");

	// Проверка станций
	if($(this).data("profile").stations==null)
	    throw("Stations are not speciefed");

	var profile = $(this).data("profile");
	$("<img>").attr({"src": profile.image, "usemap": "#m-metro-map-"+(Number)($("map").size())+1, "alt" : profile.name}).addClass("m-metro").appendTo(this);

	var map = $("<map>").attr("name", "m-metro-map-"+$("map").size()+1).appendTo(this);

	var stations = profile.stations;
	/* Создание AREA элементов */
	for(i in stations) {
	    var st=stations[i]; // Одна станция метро
	    var area = $("<area>")
		.attr({
		    shape : "rect",
		    coords : st.x1+","+st.y1+","+st.x2+","+st.y2
		})

		/* MouseOver тэга Area */
		.mouseover(function() {
		    if(sets.debug)
			console.info("AREA $.mouseover event, station="+$(this).data("name"));
		    return sets.mouseover(this);
		})

		/* MouseOver тэга Area */
		.mouseout(function() {
		    if(sets.debug)
			console.info("AREA $.mouseout event, station="+$(this).data("name"));
		    return sets.mouseout(this);
		})

		/* Click тэга Area */
		.click(function() {
		    if(sets.debug)
			console.info("AREA $.click event, station="+$(this).data("name"));
		    return sets.click(this);
		})

		.data("name",st.name) // Установка имени станции

		.addClass("m-metro")

		.appendTo(map);

	    sets.callback(area); // Функция обратного вызова

	    if(sets.debug)
		console.info("Added <AREA> tag. Coords " + st.x1+","+st.y1+","+st.x2+","+st.y2);
	}
	sets.ready(); // Завершено создание схемы
    });
}

})(jQuery);